RegisterPropertyEditor

Otázka od: Petr Kuklik

7. 9. 2004 14:24

Dobry den,
  mam db-komponentu, kde vedle property DataSource a DataField pouzivam jeste
DataFieldObsah. Chtel bych teto property zajistit stejne chovani v
ObjectInspectoru jako ma DataField. Nevite jak toho docilit? Je
RegisterPropertyEditor spravna funkce? A pokud ano, cim mam vyplnit jeji
parametry?

Diky Petr Kuklik


Odpovedá: Vaclav Krmela

7. 9. 2004 15:20

> From: Petr Kuklik
>
> mam db-komponentu, kde vedle property DataSource a DataField pouzivam
> jeste DataFieldObsah. Chtel bych teto property zajistit stejne chovani
v
> ObjectInspectoru jako ma DataField. Nevite jak toho docilit? Je
> RegisterPropertyEditor spravna funkce? A pokud ano, cim mam vyplnit
jeji
> parametry?

Zkus to takto:

{ TKeyField }

type
  TDataFieldObsah = class(TStringProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
    function GetAttributes: TPropertyAttributes; override;
  end;

procedure TDataFieldObsah.GetValues(Proc: TGetStrProc);
var I: Integer;
begin
  with GetComponent(0) as TDb-komponenta do
   if Assigned(DataSource) then
    if Assigned(DataSource.DataSet) then
      for I := 0 to DataSource.DataSet.FieldCount - 1 do
          Proc(DataSource.DataSet.Fields[i].FieldName);
end;

function TDataFieldObsah.GetAttributes: TPropertyAttributes;
begin
  Result := [paValueList, paSortList];
end;

{ Register }

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(string), TDb-komponenta,
        'DataFieldObsah', TDataFieldObsah);
end;

Vaclav Krmela



Odpovedá: Ondrej Kelle

7. 9. 2004 16:28

> Dobry den,
> mam db-komponentu, kde vedle property DataSource a
> DataField pouzivam jeste DataFieldObsah. Chtel bych teto
> property zajistit stejne chovani v ObjectInspectoru jako ma
> DataField. Nevite jak toho docilit? Je RegisterPropertyEditor
> spravna funkce? A pokud ano, cim mam vyplnit jeji parametry?

Ano, RegisterPropertyEditor je presne ono. Je to popisane v helpe, parametre
zavisia od toho, ako chces ten property editor registrovat.

V design package:

uses
  DesignIntf, DBReg,
  MyDBControl;

procedure Register;
begin
  RegisterComponents('Data Controls', [TMyDBControl]);
  RegisterPropertyEditor(TypeInfo(string), TMyDBControl, 'DataFieldObsah',
TDataFieldProperty);
end;

a v requires tej package musia byt designide.dcp (tam je DesignIntf) a
dcldb.dcp (tam je DBReg).
To plati pre Delphi 6 a 7. Predtym sa myslim ta unita volala DsgnIntf.

Tento priklad registruje TDataFieldProperty pre konkretnu vlastnost typu
string s nazvom DataFieldObsah pre konkretnu triedu TMyDBControl (a jej
potomkov). Da sa to registrovat aj vseobecnejsie, podrobnosti najdes v
helpe.

HTH
TOndrej


Odpovedá: Petr Kuklik

8. 9. 2004 7:52

>>>> "Ondrej Kelle" <o.kelle@digitalpublishing.de> 7.9.2004 16:54:20 >>>
>> Dobry den,
>> mam db-komponentu, kde vedle property DataSource a
>> DataField pouzivam jeste DataFieldObsah. Chtel bych teto
>> property zajistit stejne chovani v ObjectInspectoru jako ma
>> DataField. Nevite jak toho docilit? Je RegisterPropertyEditor
>> spravna funkce? A pokud ano, cim mam vyplnit jeji parametry?

>Ano, RegisterPropertyEditor je presne ono. Je to popisane v helpe, parametre
>zavisia od toho, ako chces ten property editor registrovat.

>V design package:

>uses
> DesignIntf, DBReg,
> MyDBControl;

>procedure Register;
>begin
> RegisterComponents('Data Controls', [TMyDBControl]);
> RegisterPropertyEditor(TypeInfo(string), TMyDBControl, 'DataFieldObsah',
TDataFieldProperty);
>end;

>a v requires tej package musia byt designide.dcp (tam je DesignIntf) a
>dcldb.dcp (tam je DBReg).
>To plati pre Delphi 6 a 7. Predtym sa myslim ta unita volala DsgnIntf.

Presne tohle potrebuju, podle navodu jsem v balicku vse udelal a skutecne v
designtime to funguje, ALE nejde mi prelozit projekt, ktery s mym balickem
komponent pracuje, Delpham se nedari zkompilovat unitu DesignWindows, protoze
nemuze najit unitu ComponentDesigner. Proc jde balicek prelozit a projekt ne?

Diky Petr


Odpovedá: tondrej@t-online.de

8. 9. 2004 8:25

> Presne tohle potrebuju, podle navodu jsem v balicku vse udelal a
> skutecne v designtime to funguje, ALE nejde mi prelozit projekt,
> ktery s mym balickem komponent pracuje, Delpham se nedari zkompilovat
> unitu DesignWindows, protoze nemuze najit unitu ComponentDesigner.
> Proc jde balicek prelozit a projekt ne?

Design time kod musi byt oddeleny od runtime.
Vytvor si runtime-only package s Tvojou kontrolkou a tu mozes pouzivat v
projektoch. Potom si vytvor designtime-only package s registraciou v
IDE, ktora je zavisla na tej runtime.
Podstatne je, aby ta runtime package nijakym sposobom nepouzivala
designtime veci od Borlandu.

http://bdn.borland.com/article/0,1410,27717,00.html

HTH
TOndrej